package com.ruoyi.aitcommon.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.aitcommon.vo.AggMap;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class ObjUtils {
	public static String toString(Object obj) {
		if(obj==null)
			return "";
		else if(obj.getClass().isArray())
//			将arr展示为[1, 2, 3],而不是[Ljava.lang.Integer;@816f27d
			return Arrays.toString((Object[])obj);
		else
			return obj.toString();
	}

	/**
	 * 利用FASTJSON进行深度Clone
	 * @param obj clone对象
	 * @param clazz 对象类型
	 */
	public static <T> T deepClone(Object obj,Class<T> clazz){
		String str = JSON.toJSONString(obj);
		T retobj = JSON.parseObject(str, clazz);
		return retobj;
	}
	
	/**
	 * 使用toString替代
	 * @param objs
	 * @return
	 */
	@Deprecated
	public static String toArrString(Object[] objs) {
		return Arrays.toString(objs);
	}
	
	public static boolean isBlank(Object obj) {
		if(obj==null)
			return true;
		else if(obj instanceof List&&((List<?>) obj).size()==0)
			return true;
		else if(obj.getClass().isArray()&&((Object[])obj).length==0)
			return true;
		else if(obj.toString().length()==0)
			return true;
		else
			return false;
	}
	
	public static boolean isNotBlank(Object obj) {
		return !isBlank(obj);
	}
	
	public static void checkBlank(Object obj,String msg) throws Exception {
		if(isBlank(obj))
			throw new Exception(msg);
	}

	/**
	 * 检查对象为空则报错
	 * @param obj
	 * @param msg
	 * @param args 格式:%s
	 * @throws Exception
	 */
	public static void checkBlank(Object obj,String msg,Object... args) throws Exception {
		if(isBlank(obj)) {
			msg=String.format(msg, args);
			throw new Exception(msg);
		}
	}
	
	
	public static String[] toArray(List<String> list) {
		String[] array = list.toArray(new String[list.size()]);
		return array;
	}

	/**
	 * 将list转换为array
	 * 举例 Integer[] array1 = ObjUtils.toArray(list1,Integer.class);
	 * @param <T>
	 * @param list 
	 * @param clazz list中元素的class
	 * @return
	 */
	public static <T> T[] toArray(List<T> list,Class<?> clazz) {
		T[] array = list.toArray((T[]) Array.newInstance(clazz,list.size()));
		return array;
	}

	/**
	 * 将元素转换为数组
	 * @param clazz 元素类型
	 * @param item 元素集合
	 * @return 数组
	 */
	public static <T> T[] toArray(Class<?> clazz,T... item){
		final List<T> list = toList(item);
		final T[] arr = toArray(list, clazz);
		return arr;
	}
	
	public static List<String> toList(String... strs){
		List<String> retlist=new ArrayList<String>();
		for(String str:strs) {
			retlist.add(str);
		}
		return retlist;
	}
	
	/**
	 * 调用JAVA的Arrays类:数组的常用操作
	 * 缺点: 返回的List为java.util.Arrays.ArrayList,该集合为视图,不可修改
	 * 举例: Arrays.asList("Larry", "Moe", "Curly");
	 * 优化: 外层在套一个new ArrayList<T>
	 * @param <T>
	 * @param item
	 * @return
	 */
	public static <T> List<T> toList(T... item){
		List<T> retlist = new ArrayList<T>(Arrays.asList(item));
		return retlist;
	}


	
	/**
	 * 将对象转换为List,并强制将T转换类型为U
	 * @param <T>
	 * @param <U>
	 * @param clazz
	 * @param objs
	 * @return
	 */
	public static <T,U> List<U> toList(Class<U> clazz,T... objs){
		List<U> retlist=new ArrayList<U>();
		if(objs==null) return retlist;
		
		for(T item:objs) {
			retlist.add((U)item);
		}
		return retlist;
	}
	
	/**
	 * 数组的排序
	 * 缺点:基础类型 int,long等不能调用comp方法,在Arrays中内置了排序规则
	 * @param arr
	 * @param comp
	 */
	public static <T> void sort(T[] arr, Comparator<? super T> comp) {
		Arrays.sort(arr, comp);
	}
	
	public static void main(String[] args) {
		final String[] arr = toArray(String.class, "1111111");
		System.out.println(arr);
		System.out.println(toString(arr));
	}
}
